/**
 * @description 数据类型
 * @author 张航
 * @date 2020-03-18 12:29:35
 * @version V1.0.0
 */

/**
 * @functionName isPrimitive
 * @param {*} value 被检测的数据
 * @return {Boolean} 返回结果
 * @description 检测数据是不是原始数据类型
 * @author 张航
 * @date 2019-07-10 13:42:00
 * @version V1.0.0
 */
export const isPrimitive = (value = '') => {
  return isStatic(value) || typeof value === 'symbol'
}

/**
* @functionName isStatic
* @param {*} value 被检测的数据
* @return {Boolean} 返回结果
* @description 检测数据是不是除了symbol外的原始数据类型
* @author 张航
* @date 2019-07-10 09:21:32
* @version V1.0.0
*/
export const isStatic = (value = '') => {
  return (
    typeof value === 'string' ||
    typeof value === 'number' ||
    typeof value === 'boolean' ||
    typeof value === 'undefined' ||
    value === null
  )
}

/**
 * @functionName getRawType
 * @param {*} value 被检测的数据
 * @return {String} 数据类型
 * @description 获取数据类型
 * @author 张航
 * @date 2019-07-10 13:48:55
 * @version V1.0.0
 */
export const getRawType = (value = '') => {
  return Object.prototype.toString.call(value).slice(8, -1)
}

/**
 * @functionName isObject
 * @param {*} value 被检测的数据
 * @return {Boolean} 返回结果
 * @description 判断数据是不是引用类型的数据
 * @author 张航
 * @date 2019-07-10 13:43:48
 * @version V1.0.0
 */
export const isObject = (value = '') => {
  const type = typeof value
  return value !== null && (type === 'object' || type === 'function')
}

/**
 * @functionName isObjectLike
 * @param {*} value 被检测的数据
 * @return {Boolean} 返回结果
 * @description 检查数据是不是类对象
 * @author 张航
 * @date 2019-07-10 13:46:44
 * @version V1.0.0
 */
export const isObjectLike = (value = '') => {
  return value !== null && typeof value === 'object'
}

/**
 * @functionName isPlainObject
 * @param {*} value 被检测的数据
 * @return {Boolean} 返回结果
 * @description 判断数据是不是Object类型的数据
 * @author 张航
 * @date 2019-07-10 14:41:44
 * @version V1.0.0
 */
export const isPlainObject = (obj = '') => {
  return Object.prototype.toString.call(obj) === '[object Object]'
}

/**
 * @functionName isFunction
 * @param {*} value 被检测的数据
 * @return {Boolean} 返回结果
 * @description 检查数据是不是函数
 * @author 张航
 * @date 2019-07-10 14:40:42
 * @version V1.0.0
 */
export const isFunction = (value = '') => {
  return Object.prototype.toString.call(value) === '[object Function]'
}

/**
 * @functionName isLength
 * @param {*} value 被检测的数据
 * @return {Boolean} 返回结果
 * @description 检查数据是否为有效的类数组长度
 * @author 张航
 * @date 2019-07-10 14:38:53
 * @version V1.0.0
 */
export const isLength = (value = '') => {
  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= Number.MAX_SAFE_INTEGER
}

/**
 * @functionName isArrayLike
 * @param {*} value 被检测的数据
 * @return {Boolean} 返回结果
 * @description 检查数据是否是类数组
 * @author 张航
 * @date 2019-07-10 14:36:32
 * @version V1.0.0
 */
export const isArrayLike = (value = '') => {
  return value !== null && isLength(value.length) && !isFunction(value)
}

/**
 * @functionName isJSON
 * @param {String} str 待检测的字符串
 * @return {String} 检测后的结果
 * @description 检查数据是否是json字符串
 * @author 张航
 * @date 2019-07-10 14:13:54
 * @version V1.0.0
 */
export const isJSON = (str = '') => {
  if (typeof str === 'string') {
    try {
      const obj = JSON.parse(str)
      if (typeof obj === 'object' && obj) {
        return true
      } else {
        return false
      }
    } catch (e) {
      console.log('error：' + str + '!!!' + e)
      return false
    }
  }
  console.error('It is not a string!')
}

/**
 * @functionName isEmpty
 * @param {*} value 被检测的数据
 * @return {Boolean} 返回结果
 * @description 检查数据是否为空
 * @author 张航
 * @date 2019-07-10 13:52:21
 * @version V1.0.0
 */
export const isEmpty = (value = '') => {
  if (value === null) {
    return true
  }
  if (isArrayLike(value)) {
    return !value.length
  } else if (isPlainObject(value)) {
    for (const key in value) {
      if (hasOwnProperty.call(value, key)) {
        return false
      }
    }
    return true
  }
  return false
}
